/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package arbol_sintactico_abstracto;

import analizadorlexico.Token;
import tabla_de_simbolos.Clase;
import tabla_de_simbolos.Constructor;
import tabla_de_simbolos.ErrorSemantico;
import tabla_de_simbolos.TablaDeSimbolos;
import tabla_de_simbolos.Tipo;
import tabla_de_simbolos.TipoPrimitivo;
import generador_de_codigo.GeneradorDeCodigo;
import java.io.IOException;

/**
 *
 * @author Javi
 */
public class ExpUnaria extends Expresion {
    private Expresion exp;
    private Token operador;

    public ExpUnaria(Expresion exp, Token operador) {
        this.exp = exp;
        this.operador = operador;
    }
    
    

    @Override
    public Tipo check(Clase clase, Constructor metodo, TablaDeSimbolos ts) throws ErrorSemantico, IOException {
        Tipo t_exp = exp.check(clase, metodo,ts);
        if(operador.getLexema().equals("+") || operador.getLexema().equals("-")){
            if(!t_exp.getNombre().equals("int"))
                throw new ErrorSemantico("El operador unario '+' o '-' solo puede aplicarse a expresiones enteras.Linea: "+operador.getLinea() );
            
            if(operador.getLexema().equals("-"))
                GeneradorDeCodigo.generar("NEG \n");
        }
        if(operador.getLexema().equals("!") ){
            if(!t_exp.getNombre().equals("boolean"))
                throw new ErrorSemantico("El operador unario '!' solo puede aplicarse a expresiones booleanas.Linea: "+operador.getLinea());
            GeneradorDeCodigo.generar("NOT \n");
        } 
        return t_exp;
    }
    
}
